@Mapping এর expression অ্যাট্রিবিউট ব্যবহার

Expression এবং Method Reference - ম্যাপস্ট্রাক্ট (MapStruct) - Java Technologies

263

MapStruct একটি জনপ্রিয় Java মডেল ম্যাপিং ফ্রেমওয়ার্ক, যা অটোমেটিক ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং সম্পন্ন করতে ব্যবহৃত হয়। MapStruct ডিফল্ট ম্যাপিং লজিকের বাইরে গিয়ে কাস্টম লজিক প্রয়োগ করতে সহায়তা করে। এর মধ্যে একটি শক্তিশালী বৈশিষ্ট্য হল @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট, যা আপনি যখন প্রপার্টি ম্যাপিংয়ের জন্য কাস্টম এক্সপ্রেশন বা লজিক প্রয়োগ করতে চান তখন ব্যবহার করতে পারেন।

এটি বিশেষত তখন উপকারী, যখন আপনি একটি ফিল্ডের মানের উপর নির্ভর করে ম্যাপিং করতে চান, যেমন বিভিন্ন ডেটা ফর্ম্যাট বা কাস্টম কনভার্সন।

এই টিউটোরিয়ালে, আমরা MapStruct এর @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে কাস্টম ম্যাপিং এবং কনভার্সন করার কিছু উদাহরণ দেখব।


১. @Mapping এর expression অ্যাট্রিবিউট ব্যবহার

@Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে আপনি Java এক্সপ্রেশন লিখতে পারেন যা ম্যাপিং অপারেশন সম্পাদন করবে। এর মাধ্যমে, আপনি জাভা কোড হিসেবে কাস্টম লজিক প্রয়োগ করতে পারেন, যেমন যোগফল বা নির্দিষ্ট ধরণের কনভার্সন।

উদাহরণ: String থেকে Integer ম্যাপিং

ধরা যাক, আপনার কাছে একটি PersonDTO ক্লাস আছে এবং আপনি ageString নামক একটি স্ট্রিং প্রপার্টি থেকে age নামক একটি ইন্টিজার প্রপার্টিতে মান ম্যাপ করতে চান। এখানে ageString এর মান "25 years" রূপে থাকতে পারে, যেটি থেকে শুধুমাত্র সংখ্যাটি বের করে নিতে হবে।

Person.java (DTO):

public class PersonDTO {
    private String name;
    private String ageString;

    // Getters and Setters
}

PersonEntity.java (Entity/Domain Object):

public class PersonEntity {
    private String name;
    private int age;

    // Getters and Setters
}

এখন, MapStruct এর মাধ্যমে এই ম্যাপিংটি করতে, আপনি expression অ্যাট্রিবিউট ব্যবহার করতে পারেন যা স্ট্রিং থেকে ইন্টিজার কনভার্ট করবে।

PersonMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(source = "ageString", target = "age", 
             expression = "java(Integer.parseInt(person.getAgeString().replaceAll(\"\\D+\", \"\")))")
    PersonEntity personDTOToPersonEntity(PersonDTO person);
}

এখানে, ageString ফিল্ডের স্ট্রিং মান থেকে সকল অক্ষর (non-digit characters) মুছে ফেলা হয়েছে এবং শুধুমাত্র সংখ্যা ব্যবহার করে Integer তে কনভার্ট করা হয়েছে। এটি expression অ্যাট্রিবিউটের মাধ্যমে কাস্টম কোড হিসেবে সম্পন্ন হয়েছে।


২. Date Formatting Mapping using expression

ধরা যাক, আপনি একটি Date অবজেক্টকে একটি String ফরম্যাটে ম্যাপ করতে চান। এর জন্য @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করতে পারেন।

উদাহরণ: Date থেকে String এ কনভার্ট করা

PersonDTO.java:

import java.util.Date;

public class PersonDTO {
    private String name;
    private Date birthDate;

    // Getters and Setters
}

PersonEntity.java:

public class PersonEntity {
    private String name;
    private String birthDate;

    // Getters and Setters
}

এখন, আপনি birthDate কে একটি String ফরম্যাটে ম্যাপ করতে পারেন, যেমন "dd-MM-yyyy"

PersonMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.text.SimpleDateFormat;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(source = "birthDate", target = "birthDate",
             expression = "java(new SimpleDateFormat(\"dd-MM-yyyy\").format(person.getBirthDate()))")
    PersonEntity personDTOToPersonEntity(PersonDTO person);
}

এখানে, birthDate (যা Date টাইপের) কে একটি String টাইপে কনভার্ট করা হয়েছে "dd-MM-yyyy" ফরম্যাটে। SimpleDateFormat ব্যবহার করে এই কনভার্টশনটি সম্পন্ন করা হয়েছে।


৩. Using expression for Complex Object Mapping

যদি আপনার ম্যাপিংয়ে কিছু জটিল লজিক বা কাস্টম অবজেক্টের মান প্রক্রিয়াজাত করতে হয়, তবে আপনি expression অ্যাট্রিবিউটের মাধ্যমে জটিল ম্যাপিং লজিক প্রয়োগ করতে পারেন।

উদাহরণ: Complex Object Mapping with expression

ধরা যাক, একটি AddressDTO অবজেক্ট আছে এবং তার মধ্যে street এবং city প্রপার্টি রয়েছে, এবং আপনি এগুলি একটি fullAddress স্ট্রিংয়ে যুক্ত করতে চান।

AddressDTO.java:

public class AddressDTO {
    private String street;
    private String city;

    // Getters and Setters
}

AddressEntity.java:

public class AddressEntity {
    private String fullAddress;

    // Getters and Setters
}

এখন, MapStruct এর মাধ্যমে আপনি street এবং city ফিল্ডগুলোকে একত্রিত করে fullAddress তৈরি করতে পারেন।

AddressMapper.java:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface AddressMapper {
    AddressMapper INSTANCE = Mappers.getMapper(AddressMapper.class);

    @Mapping(source = "street", target = "fullAddress", 
             expression = "java(address.getStreet() + \", \" + address.getCity())")
    AddressEntity addressDTOToAddressEntity(AddressDTO address);
}

এখানে, expression অ্যাট্রিবিউট ব্যবহার করে street এবং city কে যুক্ত করে একটি fullAddress স্ট্রিং তৈরি করা হয়েছে।


৪. Custom Logic with expression

MapStruct এর expression অ্যাট্রিবিউট ব্যবহার করে আপনি সহজেই কাস্টম লজিক যুক্ত করতে পারেন। এটি বিশেষত তখন ব্যবহৃত হয় যখন ডিফল্ট ম্যাপিংয়ের বাইরে কিছু কাস্টম অপারেশন করতে হয়। আপনি এতে সহজেই জাভা এক্সপ্রেশন ব্যবহার করতে পারেন, যেমন গাণিতিক অপারেশন, স্ট্রিং ফরম্যাটিং, বা কাস্টম কনভার্সন।

উদাহরণ: String থেকে Enum Mapping

public enum Status {
    ACTIVE,
    INACTIVE
}

public class PersonDTO {
    private String statusString;

    // Getters and Setters
}

public class PersonEntity {
    private Status status;

    // Getters and Setters
}

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(source = "statusString", target = "status",
             expression = "java(Status.valueOf(person.getStatusString().toUpperCase()))")
    PersonEntity personDTOToPersonEntity(PersonDTO person);
}

এখানে, statusString (যেমন "active" বা "inactive") থেকে Enum টাইপ Status এ কনভার্ট করার জন্য expression ব্যবহার করা হয়েছে।


সারাংশ

MapStruct এর @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে আপনি খুব সহজেই কাস্টম ম্যাপিং লজিক এবং কনভার্সন প্রয়োগ করতে পারেন। আপনি এতে জাভা এক্সপ্রেশন ব্যবহার করে প্রপার্টি মান কনভার্ট, ফরম্যাট বা কাস্টম লজিক প্রয়োগ করতে পারবেন, যা আপনাকে ম্যাপিংয়ের জন্য আরও বেশি কাস্টমাইজেশন এবং নমনীয়তা প্রদান করে। এটি ডোমেইন অবজেক্ট থেকে DTO অথবা অন্যান্য অবজেক্টে ডেটা ট্রান্সফার করার প্রক্রিয়াকে আরও কার্যকর এবং উন্নত করে তোলে।


Content added By
Promotion

Are you sure to start over?

Loading...